package com.sojson.util.verifycode;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;

import com.sojson.util.verifycode.VerifyCodeUtil.Verify;

/**
 * 验证码工具类接口
 * 
 * @author liu
 * @Date 2020-06-02 15:11:28
 * @Description
 *
 */
public interface VerifyCodeUtilInterface {

    /**
     * 使用系统默认字符源生成默认长度的验证码
     * 
     * @return
     */
    Verify generateVerifyCode();

    /**
     * 使用系统默认字符源生成验证码
     * 
     * @param verifySize 验证码长度
     * @return
     */
    Verify generateVerifyCode(int verifySize);

    /**
     * 使用指定源生成默认长度的验证码
     * 
     * @param sources 验证码字符源
     * @return
     */
    Verify generateVerifyCode(char[] sources);

    /**
     * 使用系统默认字符源生成验证码
     * 
     * @param minSize 验证码最小长度
     * @param maxSize 验证码最大长度
     * @return
     */
    Verify generateVerifyCode(int minSize, int maxSize);

    /**
     * 使用指定源生成验证码
     * 
     * @param minSize 验证码最小长度
     * @param maxSize 验证码最大长度
     * @param sources 验证码字符源
     * @return
     */
    Verify generateVerifyCode(int minSize, int maxSize, char[] sources);

    /**
     * 使用指定源生成验证码
     * 
     * @param verifySize 验证码长度
     * @param sources 验证码字符源
     * @return
     */
    Verify generateVerifyCode(int verifySize, char[] sources);

    /**
     * 使用指定源生成验证码
     * 
     * @param sources 验证码字符源
     * @param codeType 验证码类型
     * @return
     */
    Verify generateVerifyCode(char[] sources, int codeType);

    /**
     * 使用指定源生成验证码
     * 
     * @param verifySize 验证码长度
     * @param sources 验证码字符源
     * @param codeType 验证码类型
     * @return
     */
    Verify generateVerifyCode(int verifySize, char[] sources, int codeType);

    /**
     * 生成单词数字验证码
     * 
     * @return
     */
    Verify generateVerifyCodeByWordNumber();

    /**
     * 生成单词数字验证码
     * 
     * @param verifySize 验证码长度
     * @param sources 验证码字符源
     * @return
     */
    Verify generateVerifyCodeByWordNumber(int verifySize, char[] sources);

    /**
     * 生成算法验证码
     * 
     * @return
     */
    Verify generateVerifyCodeByCompute();

    /**
     * 获取验证码
     * 
     * @param codePrefix 验证码名称
     * @throws IOException 
     */
    Verify getVerifyCode(String verifyCode) throws IOException;

    /**
     * 清除验证码
     * 
     * @param verifyCode 验证码名称
     * @throws IOException 
     */
    void clearVerifyCode(String verifyCode) throws IOException;

    /**
     * 清除验证码
     * 
     * @param verify 验证码
     * @throws IOException 
     */
    void clearVerifyCode(Verify verify) throws IOException;

    /**
     * 对比验证码
     * 
     * @param codeName 验证码名称
     * @param code 验证码
     * @return
     * @throws IOException 
     */
    boolean verifyCode(String codeName, String code) throws IOException;

    /**
     * 对比验证码
     * 
     * @param verify 验证码
     * @param code 验证码
     * @return
     * @throws IOException 
     */
    boolean verifyCode(Verify verify, String code) throws IOException;

    /**
     * 设置验证码名称
     * 
     * @param verifyCodePrefix 验证码前缀
     * @return
     */
    String packagingverifyCodeName(String verifyCodePrefix);

    /**
     * 对比并清除验证码
     * 
     * @param codeName 验证码名称
     * @param code 验证码
     * @return
     * @throws IOException 
     */
    boolean verifyAndClearCode(String codeName, String code) throws IOException;

    /**
     * 对比并清除验证码
     * 
     * @param verify 验证码
     * @param code 验证码
     * @return
     * @throws IOException 
     */
    boolean verifyAndClearCode(Verify verify, String code) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @return
     */
    BufferedImage getVerifyCodeBufferedImage(String code);

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @return
     */
    BufferedImage getVerifyCodeBufferedImage(int width, int height, int fontSize, int fontWidth, int heightMargin,
        String code);

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @return
     */
    BufferedImage getVerifyCodeBufferedImage(String code, int lineHeight);

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @return
     */
    BufferedImage getVerifyCodeBufferedImage(int width, int height, int fontSize, int fontWidth, int heightMargin,
        String code, int lineHeight);

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @return
     */
    byte[] getVerifyCodeBytes(String code) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param suffix 验证码图片的格式
     * @return
     */
    byte[] getVerifyCodeBytes(String code, String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @return
     */
    byte[] getVerifyCodeBytes(int width, int height, int fontSize, int fontWidth, int heightMargin, String code)
        throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param suffix 验证码图片的格式
     * @return
     */
    byte[] getVerifyCodeBytes(int width, int height, int fontSize, int fontWidth, int heightMargin, String code,
        String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @return
     */
    byte[] getVerifyCodeBytes(String code, int lineHeight) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @param suffix 验证码图片的格式
     * @return
     */
    byte[] getVerifyCodeBytes(String code, int lineHeight, String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @return
     * @throws IOException 
     */
    byte[] getVerifyCodeBytes(int width, int height, int fontSize, int fontWidth, int heightMargin, String code,
        int lineHeight) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @param suffix 验证码图片的格式
     * @return
     * @throws IOException 
     */
    byte[] getVerifyCodeBytes(int width, int height, int fontSize, int fontWidth, int heightMargin, String code,
        int lineHeight, String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @return
     */
    ByteArrayInputStream getVerifyCodeInputStream(String code) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param suffix 验证码图片的格式
     * @return
     */
    ByteArrayInputStream getVerifyCodeInputStream(String code, String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @return
     */
    ByteArrayInputStream getVerifyCodeInputStream(int width, int height, int fontSize, int fontWidth, int heightMargin,
        String code) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param suffix 验证码图片的格式
     * @return
     */
    ByteArrayInputStream getVerifyCodeInputStream(int width, int height, int fontSize, int fontWidth, int heightMargin,
        String code, String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @return
     */
    ByteArrayInputStream getVerifyCodeInputStream(String code, int lineHeight) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @param suffix 验证码图片的格式
     * @return
     */
    ByteArrayInputStream getVerifyCodeInputStream(String code, int lineHeight, String suffix) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @return
     * @throws IOException 
     */
    ByteArrayInputStream getVerifyCodeInputStream(int width, int height, int fontSize, int fontWidth, int heightMargin,
        String code, int lineHeight) throws IOException;

    /**
     * 生成验证码图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param fontSize 字体大小
     * @param fontWidth 字体所占宽度(不是字体宽度)
     * @param heightMargin 字体底部与底部边框的距离
     * @param code 验证码
     * @param lineHeight 验证码干扰线距离
     * @param suffix 验证码图片的格式
     * @return
     * @throws IOException 
     */
    ByteArrayInputStream getVerifyCodeInputStream(int width, int height, int fontSize, int fontWidth, int heightMargin,
        String code, int lineHeight, String suffix) throws IOException;

    /** 获取验证码的默认长度 */
    int getVerifySize();

    /** 获取验证码默认有效时间(单位: 毫秒) */
    int getDefaultTime();

    /** 获取图片的宽度 */
    int getWidth();

    /** 获取图片的高度 */
    int getHeight();

    /** 获取字体大小 */
    int getFontSize();

    /** 获取字体所占宽度(不是字体宽度) */
    int getFontWidth();

    /** 获取字体底部与边框顶部的距离 */
    int getHeightMargin();

    /** 获取验证码干扰距离 */
    int getLineHeight();

}